package com.mayfool.gitmanager.core.manager;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mayfool.gitmanager.core.helper.LogHelper;
import com.mayfool.gitmanager.core.entity.TaskInfo;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 任务管理器
 * 
 * @author zhou.xu
 * @date 2024-01-08 10:30:00
 * 
 * 该类提供了任务管理的核心功能，包括：
 * 1. 任务列表的维护和管理
 * 2. 任务信息的持久化（JSON格式）
 * 3. 任务的增删改查操作
 * 
 * 使用CopyOnWriteArrayList确保线程安全
 * 实现了单例模式，所有方法都是静态的
 */
public class TaskManager {

    /**
     * 任务列表，使用CopyOnWriteArrayList保证线程安全
     * 存储所有被管理的任务信息
     */
    private static final List<TaskInfo> tasks = new CopyOnWriteArrayList<>();

    /**
     * 获取任务列表的副本
     * 返回新的ArrayList以避免外部修改影响内部状态
     * 
     * @return 任务列表副本
     */
    public static List<TaskInfo> getTasks() {
        return new ArrayList<>(tasks);
    }

    /**
     * 添加新任务到管理器
     * 如果任务已存在或为null则不添加
     * 
     * @param taskInfo 任务信息对象
     */
    public static void addTask(TaskInfo taskInfo) {
        if (tasks.contains(taskInfo))
            return;
        if (taskInfo == null)
            return;
        tasks.add(taskInfo);
    }

    /**
     * 将任务列表保存为JSON文件
     * 使用Jackson库进行序列化
     * 文件保存在当前用户目录下的tasks.json
     */
    public static void saveTasksToJson() {
        try {
            ObjectMapper mapper = new ObjectMapper();
            mapper.writeValue(new File(System.getProperty("user.dir"), "tasks.json"), tasks);
        } catch (IOException e) {
            LogHelper.getInstance().append("任务保存失败: ").append(e.getMessage()).append("\n");
        }
    }

    /**
     * 从JSON文件加载任务列表
     * 在类加载时通过静态代码块调用
     * 如果文件不存在或加载失败，任务列表保持为空
     */
    public static void loadTasksFromJson() {
        File jsonFile = new File(System.getProperty("user.dir"), "tasks.json");
        if (jsonFile.exists()) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                List<TaskInfo> taskInfos = mapper.readValue(jsonFile, new TypeReference<List<TaskInfo>>() {
                });
                tasks.addAll(taskInfos);
            } catch (IOException e) {
                LogHelper.getInstance().append("任务加载失败: ").append(e.getMessage()).append("\n");
            }
        }
    }

    /**
     * 静态初始化块
     * 在类加载时自动从JSON文件加载已保存的任务列表
     */
    static {
        loadTasksFromJson();
    }

    /**
     * 删除指定的任务
     * 如果任务存在则删除并返回true，否则返回false
     * 
     * @param taskInfo 要删除的任务信息
     * @return 是否成功删除
     * @author zhou.xu
     * @date 2024-03-18 11:35:00
     */
    public static boolean removeTask(TaskInfo taskInfo) {
        if (taskInfo == null) return false;
        boolean removed = tasks.remove(taskInfo);
        if (removed) {
            saveTasksToJson();
            LogHelper.getInstance().append("删除任务: ").append(taskInfo.getTaskName()).append("\n");
        }
        return removed;
    }
}
